#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> 
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;

void MyHandler(int sigNo)
{
    sleep(3);   // 方便观察，让子进程僵尸一会
    pid_t rid = 0;
    while(rid = waitpid(-1, nullptr, WNOHANG) > 0) {
        cout << "Process " << getpid() << " catch a signal, signal number:" 
        << sigNo << " child quit pid: "<< rid << endl;
    }
}

int main()
{
    // srand(time(nullptr));
    signal(SIGCHLD, SIG_IGN);
    for(int i = 0; i < 10; ++i) {
        pid_t n = fork();
        if(n == 0) {
            // child
            int cnt = 3;
            while(cnt--) {
                cout << "I am child process, pid: " << getpid() << " ppid: " << getppid() << endl;
                sleep(3);
            }
            cout << "Child quit!" << endl;
            exit(0);
        }
    }
    // father
    while(true) {
        cout << "I am father process, pid: " << getpid() << endl;
        sleep(1);
    }
    return 0;
}



// volatile int flag = 0;

// void myHandler(int sigNo)
// {
//     cout << "Catch a signal, signal number:" << sigNo << endl;
//     flag = 1;
// }

// int main()
// {
//     signal(2, myHandler);
//     while(!flag);
//     cout << "Process normal quit" << endl;
//     return 0;
// }



// void PrintPending()
// {
//     sigset_t pending;
//     sigpending(&pending);
//     cout << "Pending: ";
//     for(size_t i = 31;i>=1;--i) {
//         if(sigismember(&pending, i))    cout << "1";
//         else cout << "0";
//     }
//     cout << endl;
// }

// void MyHandler(int sigNo) 
// {
//     cout << "Catch a signal, signal number:" << sigNo << endl;
//     while(true) {
//         PrintPending();
//         sleep(1);
//     }
// }

// int main()
// {
//     // 变量定义和初始化
//     struct sigaction act, oact;
//     memset(&act, 0, sizeof(act));
//     memset(&oact, 0, sizeof(act));
//     // 指定一个自定义函数
//     act.sa_handler = MyHandler;
//     // 在屏蔽2号信号的同时屏蔽1,3,4信号
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask, 1);
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     // 调用sigaction函数
//     sigaction(2, &act, &oact);
//     while(true) {
//         cout << "Process running! pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }